//+------------------------------------------------------------------+
//|                                                 BillWilliams.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include "Indicator.h"

//+------------------------------------------------------------------+
//| 加速震荡器指标类 (Accelerator Oscillator)                         |
//| 继承自 CIndicator 类                                             |
//+------------------------------------------------------------------+
class CiAC : public CIndicator
{
public:
   /** 构造函数 */
   CiAC(void);
   
   /** 析构函数 */
   ~CiAC(void);
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_AC); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 鳄鱼指标类 (Alligator)                                           |
//| 继承自 CIndicator 类                                            |
//+------------------------------------------------------------------+
class CiAlligator : public CIndicator
{
protected:
   int               m_jaw_period;     // 颚线周期
   int               m_jaw_shift;      // 颚线偏移
   int               m_teeth_period;   // 牙齿线周期
   int               m_teeth_shift;    // 牙齿线偏移
   int               m_lips_period;    // 唇线周期
   int               m_lips_shift;     // 唇线偏移
   ENUM_MA_METHOD    m_ma_method;      // 均线方法
   int               m_applied;         // 应用价格

public:
   /** 构造函数 */
   CiAlligator(void);
   
   /** 析构函数 */
   ~CiAlligator(void);
   
   /** 获取颚线周期 */
   int JawPeriod(void) const { return(m_jaw_period); }
   
   /** 获取颚线偏移 */
   int JawShift(void) const { return(m_jaw_shift); }
   
   /** 获取牙齿线周期 */
   int TeethPeriod(void) const { return(m_teeth_period); }
   
   /** 获取牙齿线偏移 */
   int TeethShift(void) const { return(m_teeth_shift); }
   
   /** 获取唇线周期 */
   int LipsPeriod(void) const { return(m_lips_period); }
   
   /** 获取唇线偏移 */
   int LipsShift(void) const { return(m_lips_shift); }
   
   /** 获取均线方法 */
   ENUM_MA_METHOD MaMethod(void) const { return(m_ma_method); }
   
   /** 获取应用价格 */
   int Applied(void) const { return(m_applied); }
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param jaw_period 颚线周期
    * @param jaw_shift 颚线偏移
    * @param teeth_period 牙齿线周期
    * @param teeth_shift 牙齿线偏移
    * @param lips_period 唇线周期
    * @param lips_shift 唇线偏移
    * @param ma_method 均线方法
    * @param applied 应用价格
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period,
               const int jaw_period, const int jaw_shift,
               const int teeth_period, const int teeth_shift,
               const int lips_period, const int lips_shift,
               const ENUM_MA_METHOD ma_method, const int applied);
   
   /**
    * 获取颚线值
    * @param index 索引位置
    * @return 指标值
    */
   double Jaw(const int index) const;
   
   /**
    * 获取牙齿线值
    * @param index 索引位置
    * @return 指标值
    */
   double Teeth(const int index) const;
   
   /**
    * 获取唇线值
    * @param index 索引位置
    * @return 指标值
    */
   double Lips(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_ALLIGATOR); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param jaw_period 颚线周期
    * @param jaw_shift 颚线偏移
    * @param teeth_period 牙齿线周期
    * @param teeth_shift 牙齿线偏移
    * @param lips_period 唇线周期
    * @param lips_shift 唇线偏移
    * @param ma_method 均线方法
    * @param applied 应用价格
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                   const int jaw_period, const int jaw_shift,
                   const int teeth_period, const int teeth_shift,
                   const int lips_period, const int lips_shift,
                   const ENUM_MA_METHOD ma_method, const int applied);
};

//+------------------------------------------------------------------+
//| 动量震荡指标类 (Awesome Oscillator)                              |
//| 继承自 CIndicator 类                                             |
//+------------------------------------------------------------------+
class CiAO : public CIndicator
{
public:
   /** 构造函数 */
   CiAO(void);
   
   /** 析构函数 */
   ~CiAO(void);
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_AO); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 分形指标类 (Fractals)                                            |
//| 继承自 CIndicator 类                                             |
//+------------------------------------------------------------------+
class CiFractals : public CIndicator
{
public:
   /** 构造函数 */
   CiFractals(void);
   
   /** 析构函数 */
   ~CiFractals(void);
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 获取上分形值
    * @param index 索引位置
    * @return 指标值
    */
   double Upper(const int index) const;
   
   /**
    * 获取下分形值
    * @param index 索引位置
    * @return 指标值
    */
   double Lower(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_FRACTALS); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period);
};

//+------------------------------------------------------------------+
//| 鳄鱼震荡指标类 (Gator Oscillator)                                |
//| 继承自 CIndicator 类                                             |
//+------------------------------------------------------------------+
class CiGator : public CIndicator
{
protected:
   int               m_jaw_period;     // 颚线周期
   int               m_jaw_shift;      // 颚线偏移
   int               m_teeth_period;   // 牙齿线周期
   int               m_teeth_shift;    // 牙齿线偏移
   int               m_lips_period;    // 唇线周期
   int               m_lips_shift;     // 唇线偏移
   ENUM_MA_METHOD    m_ma_method;      // 均线方法
   int               m_applied;         // 应用价格

public:
   /** 构造函数 */
   CiGator(void);
   
   /** 析构函数 */
   ~CiGator(void);
   
   /** 获取颚线周期 */
   int JawPeriod(void) const { return(m_jaw_period); }
   
   /** 获取颚线偏移 */
   int JawShift(void) const { return(m_jaw_shift); }
   
   /** 获取牙齿线周期 */
   int TeethPeriod(void) const { return(m_teeth_period); }
   
   /** 获取牙齿线偏移 */
   int TeethShift(void) const { return(m_teeth_shift); }
   
   /** 获取唇线周期 */
   int LipsPeriod(void) const { return(m_lips_period); }
   
   /** 获取唇线偏移 */
   int LipsShift(void) const { return(m_lips_shift); }
   
   /** 获取均线方法 */
   ENUM_MA_METHOD MaMethod(void) const { return(m_ma_method); }
   
   /** 获取应用价格 */
   int Applied(void) const { return(m_applied); }
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param jaw_period 颚线周期
    * @param jaw_shift 颚线偏移
    * @param teeth_period 牙齿线周期
    * @param teeth_shift 牙齿线偏移
    * @param lips_period 唇线周期
    * @param lips_shift 唇线偏移
    * @param ma_method 均线方法
    * @param applied 应用价格
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period,
               const int jaw_period, const int jaw_shift,
               const int teeth_period, const int teeth_shift,
               const int lips_period, const int lips_shift,
               const ENUM_MA_METHOD ma_method, const int applied);
   
   /**
    * 获取上缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double Upper(const int index) const;
   
   /**
    * 获取下缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double Lower(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_GATOR); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param jaw_period 颚线周期
    * @param jaw_shift 颚线偏移
    * @param teeth_period 牙齿线周期
    * @param teeth_shift 牙齿线偏移
    * @param lips_period 唇线周期
    * @param lips_shift 唇线偏移
    * @param ma_method 均线方法
    * @param applied 应用价格
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period,
                   const int jaw_period, const int jaw_shift,
                   const int teeth_period, const int teeth_shift,
                   const int lips_period, const int lips_shift,
                   const ENUM_MA_METHOD ma_method, const int applied);
};

//+------------------------------------------------------------------+
//| 市场促进指数指标类 (Market Facilitation Index)                   |
//| 继承自 CIndicator 类                                             |
//+------------------------------------------------------------------+
class CiBWMFI : public CIndicator
{
protected:
   ENUM_APPLIED_VOLUME m_applied;  // 应用成交量类型

public:
   /** 构造函数 */
   CiBWMFI(void);
   
   /** 析构函数 */
   ~CiBWMFI(void);
   
   /** 获取应用成交量类型 */
   ENUM_APPLIED_VOLUME Applied(void) const { return(m_applied); }
   
   /**
    * 创建指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool Create(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
   
   /**
    * 获取主缓冲区值
    * @param index 索引位置
    * @return 指标值
    */
   double Main(const int index) const;
   
   /** 获取指标类型 */
   virtual int Type(void) const { return(IND_BWMFI); }

protected:
   /**
    * 使用通用参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param num_params 参数数量
    * @param params 参数数组
    * @return 成功返回 true，失败返回 false
    */
   virtual bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const int num_params, const MqlParam &params[]);
   
   /**
    * 使用特殊参数初始化指标
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @param applied 应用成交量类型
    * @return 成功返回 true，失败返回 false
    */
   bool Initialize(const string symbol, const ENUM_TIMEFRAMES period, const ENUM_APPLIED_VOLUME applied);
};
//+------------------------------------------------------------------+